/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package transervfx.Dato.DAO;

import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import transervfx.Dato.Entidad.Comisionista;

/**
 *
 * @author oscar
 */
public class ComisionistaDAO implements Dao<Comisionista, Long> {

    private static ComisionistaDAO INSTANCE = null;

    /**
     * Crea el Gestor Auxiliar
     */
    protected ComisionistaDAO() {
    }

    /**
     * creador sincronizado para protegerse de posibles problemas multi-hilo
     * otra prueba para evitar instanciación múltiple
     */
    private synchronized static void createInstance() {
        if (INSTANCE == null) {
            INSTANCE = new ComisionistaDAO();
        }
    }

    /**
     * Obtiene la instancia.
     *
     * @return devuelve la instancia del "GestorAuxiliar".
     */
    public static ComisionistaDAO getInstance() {
        if (INSTANCE == null) {
            createInstance();
        }
        return INSTANCE;
    }

    @Override
    public void persist(Comisionista entity) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {
            EntityTransaction t = em.getTransaction();
            try {
                t.begin();
                em.persist(entity);
                t.commit();
            } finally {
                if (t.isActive()) {
                    t.rollback();
                }
            }
        } finally {
            em.close();
        }
    }

    
    @Override
    public void remove(Comisionista entity) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            EntityTransaction t = em.getTransaction();
            try {
                t.begin();
                System.out.println("ESTAS POR ELIMIAR");
                entity = em.getReference(Comisionista.class, entity.getId());
                em.remove(entity);
                System.out.println("LO ELIMINA");
                t.commit();
            } finally {
                if (t.isActive()) {
                    t.rollback();
                }
            }
        } finally {
            em.close();
        }
    }

    @Override
    public void update(Comisionista entity) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {


            em.getTransaction().begin();
            System.out.println("Entra a modificar el repartidor");
            em.merge(entity);

            em.getTransaction().commit();
            System.out.println("Lo modifica al repartidor");

        } finally {
            em.close();
        }
    }
//parece que guarda bien, lo que me falta ver es como acomodar ese temite del metodo ese, es por esto que esta seteando al ini mal

    @Override
    public Comisionista findById(Long id) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            return em.getReference(Comisionista.class, id);

        } finally {
            em.close();
        }
    }

    @Override
    public List<Comisionista> findAll() {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            return em.createNamedQuery("Comisionista.findAll").getResultList();

        } finally {
            em.close();
        }
    }

    public Comisionista findByCompleto(Comisionista comisionistaSeleccionado) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

           //poner find no reference
            comisionistaSeleccionado = em.find(Comisionista.class, comisionistaSeleccionado.getId());

            comisionistaSeleccionado.getDomicilio();
            
            comisionistaSeleccionado.getEmpresaComisionista();
            
            return comisionistaSeleccionado;

        } finally {
            em.close();
        }
    }

    public List<Comisionista> findByNombresAndApellido(String nombres, String apellido) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {

            Query query = em.createNamedQuery("Comisionista.findByNombresAndApellido");
            query.setParameter("nombres", nombres);
            query.setParameter("apellido", apellido);

            return query.getResultList();

        } finally {
            em.close();
        }
    }

    

    public Comisionista findByTipoDocAndNroDoc(String tipoDoc, Integer nroDoc) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {


            Query query = em.createNamedQuery("Comisionista.findByTipoDocAndNroDoc");
            query.setParameter("tipoDoc", tipoDoc);
            query.setParameter("nroDoc", nroDoc);

            List<Comisionista> lr = query.getResultList();
            if (lr.size() > 0) {
                return lr.get(0);
            } else {
                return null;
            }


        } finally {
            em.close();
        }
    }

   
    public boolean poseeGuia(Comisionista r) {
        EntityManagerFactory emf = PersistenceManager.getInstance().getEntityManagerFactory();
        EntityManager em = emf.createEntityManager();
        try {


            Comisionista rAux = em.find(Comisionista.class, r.getId());
            if (rAux.getGuiasSacas() != null) {
                if (!rAux.getGuiasSacas().isEmpty()) {
                    return true;
                }

            }
            return false;

        } finally {
            em.close();
        }
    }
}

